package src.serveur;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

import src.client.Client;

public class ThreadClient implements Runnable{
	
		
	 private Thread _t; // contiendra le thread du client
	  private Socket _s; // recevra le socket liant au client
	  private PrintWriter out; // pour gestion du flux de sortie
	  private BufferedReader in; // pour gestion du flux d'entrée
	  private src.serveur.Serveur serveur; // pour utilisation des méthodes de la classe principale
	  private int _numClient=0; // contiendra le numéro de client géré par ce thread
	  private Client client;
	  
	  
	  //** Constructeur : crée les éléments nécessaires au dialogue avec le client **
	  // le param s est donnée dans Serv par ss.accept()
	  public ThreadClient(Socket s, Serveur serv) 
	  {
		// passage de local en global (pour gestion dans les autres méthodes)
	    serveur=serv; 
	    _s=s;
	    try
	    {
	      // fabrication d'une variable permettant l'utilisation du flux de sortie avec des string
	      out = new PrintWriter(_s.getOutputStream());
	      // fabrication d'une variable permettant l'utilisation du flux d'entrée avec des string
	      in = new BufferedReader(new InputStreamReader(_s.getInputStream()));
	    }
	    catch (IOException e){ }

	    _t = new Thread(this); // instanciation du thread
	    _t.start(); // demarrage du thread, la fonction run() est ici lancée
	  }

	  
	  //** Methode :  exécutée au lancement du thread par t.start() **
	  //** Elle attend les messages en provenance du serveur et les redirige **
	  // cette méthode doit obligatoirement être implémentée à cause de l'interface Runnable
	  public void run()
	  {
		  int conn=0;
		  int codeAction=0;
	    String message = ""; // déclaration de la variable qui recevra les messages du client
	    // on indique dans la console la connection d'un nouveau client

	    System.out.println("Un nouveau client s'est connecte:");
	    try
	    {
	      // la lecture des données entrantes se fait caractère par caractère ...
	      // ... jusqu'à trouver un caractère de fin de chaine
	    	// déclaration d'un tableau de char d'1 élement, _in.read() y stockera le char lu
	      char charCur[] = new char[1]; 
	   // attente en boucle des messages provenant du client (bloquant sur _in.read())
	      if (in.read(charCur, 0, 1)!=-1)
	      {
	    	  if(charCur[0]=='C')
	    	  {
	    		  codeAction=1;
	    	  }
	      }
	      
	      if(codeAction==1)
	      {
	    	  String email="";
	    	  String motDePasse="";
	    	  boolean mDp=false;
	    	  while(in.read(charCur, 0, 1)!=-1) 
		      {
		      	// on regarde si on arrive à la fin d'une chaine ...
		        if (charCur[0] != '\u0000' && charCur[0] != '\n' && charCur[0] != '\r')
		        {
		        	if(charCur[0]!=';' && mDp==false)
		        	{
		                email += charCur[0]; // ... si non, on concatène le caractère dans le message
		        	}
		        	else
		        	{
		        			mDp=true;
		        			if(charCur[0]!=';')
		        			{
		        				motDePasse +=charCur[0];
		        			}
		        	}
		        }
		        else if(!email.equalsIgnoreCase("")&& !motDePasse.equalsIgnoreCase("")) // juste une vérification de principe
		        {
		          conn=serveur.verifConnection(email, motDePasse);
		          out.write("C"+conn);
		          out.flush();
		        //on ajoute le client dans la liste des connectés et on lui met le statut en ligne
		    	  client= new Client(out, email);
		    	  serveur.addClient(client);
		    	  //on affiche la liste des clients connectés
		    	  serveur.afficheClients();

		        }
		      }

	    	  
	      }

	    }
	    catch (Exception e){ }
	    
	    finally // finally se produira le plus souvent lors de la deconnexion du client
	    {
	      try
	      {
	      	// on indique à la console la deconnexion du client
	        System.out.println("Le client no "+_numClient+" s'est deconnecte");
	        serveur.delClient(client);
	        _s.close(); // fermeture du socket si il ne l'a pas déjà été (à cause de l'exception levée plus haut)
	      }
	      catch (IOException e){ }
	    }
	  }


}
